AOP,全称为“面向切面编程”。它是通过 预编译方式 和 运行期动态代理 实现程序功能统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP使用可以概括为10个字:纵向重复代码,横向抽取
AOP的初衷
- Don’t Repeat Yourself(不要重复自己(不要写重复的代码))
- Separation Of Concerns(关注点分离)
- 水平分离:展示层 -> 服务层 -> 持久层
- 垂直分离:模块划分(订单、库存等)
- 切面分离:功能性需求 和 非功能性需求
它要解决的问题就是将 非功能性需求 从 功能性需求 中剥离出来,集中管理,从而实现 Don’t Repeat Yourself
AOP的好处
- 集中处理某一关注点/横切逻辑
- 可以很方便的添加/删除关注点
- 侵入性少,增强代码可读性与可维护性
AOP的理解
- 是一种编程范式,不是编程语言
- 解决特定问题,不能解决所有问题
- 是OOP的补充,不是替代
编程范式概览
- 面向过程编程(C语言,…)
- 面向对象编程(Java,C++,…)
- 面向接口编程(Java 开发中常见)
- 函数式编程(Java8 引入的函数式编程,…)
- 事件驱动编程(GUI 开发中常见)
- 面向切面编程(Spring 的 AOP)
AOP的应用场景
- 权限控制
- 缓存控制
- 事务控制
- 审计日志
- 性能监控
- 分布式追踪
- 异常处理
主角Spring AOP
Spring 框架对 AOP 编程提供了支持,通过使用 Spring 提供的 AOP 功能,可以很方便的进行面向切面的编程,许多不容易用传统 OOP 实现的功能都可以使用 AOP 轻松对付。Spring 的 AOP 支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用。
入门案例
产品管理的服务
要求:对产品的添加和删除操作进行权限控制,只允许管理员操作
环境/版本一览:
- 开发工具:Intellij IDEA 2018.2.2
- springboot: 2.1.0.RELEASE
- jdk:1.8.0_171
- maven:3.3.9
- spring-boot-starter-aop:2.1.0.RELEASE
- lombok:1.18.2
1、pom.xml
1 | <dependencies> |
2、entity
1 | package com.fatal.entity; |
3、hodler
创建一个holder,假设用户登录用用户信息存储在该对象中。
1 | package com.fatal.hodler; |
4、security
AdminOnly.java
1 | package com.fatal.security; |
SecurityAspect.java
1 | package com.fatal.security; |
5、service
IProductService.java
1 | package com.fatal.serivce; |
ProductServiceImpl.java
1 | package com.fatal.serivce.impl; |
6、Test
1 | package com.fatal; |
笔记
1、切面的模板
1 | // 标注该类是切面类 |
2、Spring切面表达式
案例中 @annotation(AdminOnly) 为切点表达式。表示对方法上标注有 @AdminOnly 注解的方法进行拦截。下一章将会对 Spring切面表达式 进行系统的介绍
参考资料
总结
SpringBoot 自动开启 AOP 功能了,我们可以直接使用 @Transactional 、@Async 或者自定义的基于AOP 的注解实现切面编程
SpringBoot的知识已经有前辈在我们之前探索了。比较喜欢的博主有:唐亚峰 | Battcn、方志朋的专栏、程序猿DD、纯洁的微笑。对这门技术感兴趣的可以去他们的博客逛逛。谢谢他们的分享~~
以上文章是我用来学习的Demo,都是基于 SpringBoot2.x 版本。
源码地址: https://github.com/ynfatal/springboot2-learning/tree/master/chapter25_1